#ifndef UMLGRAPHICSITEM_H
#define UMLGRAPHICSITEM_H

#include <QGraphicsItemGroup>

#include "uml/umlitem.h"
#include "uml/effects/itemdrageffect.h"
#include "wumlpalette.h"

class UmlDirItem;

class UmlGraphicsItem : public QObject, public UmlItem, public QGraphicsItemGroup
{
    Q_OBJECT
public:
    UmlGraphicsItem(UmlProject *project = 0);

    /*! Gibt den übergeordneten Ordner zurück in dem sich dieses Item befindent.
      Gibt es keinen solchen Ordner wird 0 zurückgegeben.
      \sa _parentDir
      \return UmlDirItem | 0
    */
    UmlDirItem* parentDir();

    /*! Setzt den übergeordneten Ordner des Items.
      Das Item wird somit in den angegeben Ordner gelegt.
      \sa _parentDir
      \param dir Ordner in dem das Item liegen soll
    */
    void setParentDir(UmlDirItem *dir);

    // painting
    QRectF boundingRect() const;

    // events
    virtual QVariant itemChange(GraphicsItemChange change, const QVariant &value);

    /*! Dieses Event wird ausgelöst sobald der Mauszeiger sich erstmalig über dem Item befindet.
      \sa QGraphicsItem::hoverEnterEvent()
    */
    void hoverEnterEvent(QGraphicsSceneHoverEvent *event);

    /*! Dieses Event wird solang und oft ausgelöst wie sich  Mauszeiger über dem Item bewegt.
      \sa QGraphicsItem::hoverMoveEvent()
    */
    void hoverMoveEvent(QGraphicsSceneHoverEvent *event);

    /*! Dieses Event wird ausgelöst sobald der Mauszeiger sich letztmalig über dem Item befindet.
      \sa QGraphicsItem::hoverLeaveEvent()
    */
    void hoverLeaveEvent(QGraphicsSceneHoverEvent *event);

    /*! Dieses Event wird ausgelöst sobald ein Kontextmenü erzeugt werden soll
      \sa QGraphicsItem::contextMenuEvent()
    */
    void contextMenuEvent(QGraphicsSceneContextMenuEvent *event);

    virtual QList<QAction*> contextActions();

    void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget);

    int row() const;
    QModelIndex modelIndex();
    void setModelIndex(QModelIndex index);

protected:
    /// Hält den Ordner in dem das Item liegt.
    UmlDirItem *_parentDir;

    /// Hält den Modell-Index des Items mit dem es einem Datenmodell identifziert wird.
    QModelIndex _index;

    WUmlPalette _palette;

    /// Hält das Bounding-Rect in dem das Item gezeichnet wird.
    QRectF _boundingRect;

    ItemDragEffect *acceptDropEffect();

    ItemDragEffect *denyDropEffect();

    /*! Dieses Flag signalisiert ob das Item momentan unter dem Mauszeiger liegt
      Zustände:
        - true, falls das Item unter dem Mauszeiger liegt
        - false, sonst
    */
    bool _isHovered;

    /*! Dieses Flag signalisiert ob eine Mousetaste gedrückt wurde während sich der Mauszeiger über dem Item befindet.
      Zustände:
        - true, falls deine Maustaste gedrückt wurde
        - false, sonst
    */
    bool _isPressed;

    /// Hält die graphische Randbegrenzung des Items.
    QGraphicsPolygonItem _borderItem;

    /// Hält den Stift zum zeichnen der Umrandung.
    QPen _borderPen;

protected slots:
     virtual void remove();

signals:
     void boundingRectHasChanged();
};

#endif // UMLGRAPHICSITEM_H
